package tcp.socket;

import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.Socket;
import java.net.URLEncoder;



/**
 * Transfer-Encoding:通常，HTTP协议中使用Content-Length这个头来告知数据的长度。然后，在数据下行的过程中，Content-Length的方式要预先在服务器中缓存所有数据，然后所有数据再一股脑儿地发给客户端。
    如果要一边产生数据，一边发给客户端，WEB 服务器就需要使用"Transfer-Encoding: chunked"这样的方式来代替Content-Length。
    
    
 * @author Han
 */
public class SocketHttpClient {
	public static void main(String[] args) throws Exception {
		for(int i = 0;i<1;i++){
			testNet();
		}
	}
	
	static void testNet() throws Exception{
		String params = "areaid="+URLEncoder.encode("1","UTF-8");
		
		Socket socket = new Socket("ns.huatu.com",80);
		//拼接http协议的文本
		StringBuffer sb = new StringBuffer("POST /nsapi/user/setarea HTTP/1.1\r\n");
		sb.append("Host:ns.huatu.com\r\n");
		sb.append("Content-Length: " + params.length() + "\r\n");  
		sb.append("Content-Type: application/x-www-form-urlencoded\r\n");
		sb.append("Accept:*/*\r\n");
		sb.append("Accept-Language:zh-cn\r\n");
		sb.append("Accept-Encoding:gzip,deflate\r\n");
		sb.append("userid:587707\r\n");
		sb.append("User-Agent:Mozzila/4.0(compatible;MSIE 6.0;Windows NT 5.0)\r\n");
		sb.append("Connection:Keep-Alive\r\n");
		//请求头和请求体之间，空行分隔，同响应
		sb.append("\r\n");
		//设置参数
		sb.append(params+"\r\n");
		
		System.out.println("socket request:\r\n"+sb.toString());
		
		OutputStream socketOut = socket.getOutputStream();
		socketOut.write(sb.toString().getBytes());
		//socket.shutdownOutput();
		//这里不加读取的话，类似push，可以节省时间
		InputStream is = socket.getInputStream();
		BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
		String line = null;
		while((line = br.readLine()) != null){
			System.out.println(line);
		}
		br.close();
		is.close();
		socket.close();
		System.out.println("over");
	}
}
